#ifndef DEBUGTEST_H
#define DEBUGTEST_H

#include <map>
#include <string>
//#include "VectorMove.h"

class DebugTest {

public:
	void LaunchTests();
	void TestLegalMoves(map<string,string> & legalMovesDatabase);
	bool TestPlayUnplayMoves(map<string,string> & legalMovesDatabase,  bool verbose);
	void TestAlphaBeta();
	void TestExpectedBestMove(map<string,string> & bestMovesDatabase, int duration);
	bool TestABMinmaxVsNegmax(map<string,string> & bestMovesDatabase, int duration);
	bool TestABMinmaxVSNegascout(map<string,string> & bestMovesDatabase, int duration);
	bool TestAlphaBetaRecVSIter(map<string,string> & bestMovesDatabase,  int duration);
	bool TestSelectiveDepth(map<string,string> & bestMovesDatabase, int duration);

	void TestAlphaBetaIter();
	void TestBitboards();
	void DisplayResults(string title, map<string, string> summary);

	void initLegalMovesDatabase(map<string,string> & testPositions);
	void initBestMovesDatabase(map<string,string> & bestMovesDatabase);
	void initMatesDatabase(map<string,string> & matesDatabase);
	void initNoCheck(map<string,string> & noCheck);
	void initInCheck(map<string,string> & inCheck);
	void initInCheckmate(map<string,string> & inCheckmate);
	
	void TestBitBoardLocalEval();
	void TestPositionLoading();
	void TestBitBoards();
	void TestIsCheck(map<string,string> & noCheck, map<string,string> & inCheck, map<string,string> & inCheckmate);
	void DisplayNonVerboseTestResult(string testFctName, bool result);
	bool IsEqual(vector<Move> expected, vector<Move> list);
	void TestOptions();
	void TestHashCode();
	int GetNbPieces(Position& position);
	void DisplayMoves(vector<Move> moves, bool fullNotation);

	void DisplayCheckStatus(Position& position);
	vector<Move> StringToMoves(string s, Position& pos);
};

#endif